﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace конфигуратор
{
     public  class ОписаниеТипа
    {
         public Type Тип { get; set; }
         public ОписаниеТипа( Type тип)
         {
             Тип = тип;
         }

         public String Имя
         {
             get { return Тип.ИмяТипа(); }
         }

         public string АтрибутДоступа
         {
             get
             {
                 if (Тип.IsNested)
                 {
                     if (Тип.IsNestedFamORAssem) return "protected internal";
                     if (Тип.IsNestedAssembly) return "internal";
                     if (Тип.IsNestedPublic) return "public";
                     if (Тип.IsNestedPrivate) return "private";
                     if (Тип.IsNestedFamily) return "protected";
                 }

                 return Тип.IsNotPublic ? "internal" : "public";

             }
         }

         public string ТипТипа
         {
             get
             {  
                 if (Тип.IsEnum) return "enum";
                 if (Тип.IsClass) return "class";
                 if (Тип.IsValueType) return "struct";
               
                 if (Тип.IsInterface) return "interface";
                 return "";
             }
         }

         public string АтрибутПереопредения
         {
             get
             {
                 if (Тип.IsAbstract) return "abstract";
                 if (Тип.IsSealed) return "sealed";
                 return "";

             }
         }
         public string ТипСАтрибутомПереопределения
         {
             get { return ТипТипа+" "+ АтрибутПереопредения ; }
         }

         private Type[] _предки;
         public Type[] Предки { get
         {
             if (Тип==null) return null;
             if (_предки==null)
             {
                 var предки= new List<Type>();
                 var текущийТип = Тип;
                 while( текущийТип.BaseType!=null )
                 {
                     текущийТип = текущийТип.BaseType;
                     предки.Add(текущийТип);
                 }
                 _предки = предки.ToArray();
             }    
             return _предки;
         }} 

         
         public string Описание { get
         {
             string оп = "";
             var atrdata = Тип.GetCustomAttributesData();
             foreach (var o in atrdata)
             {
                 оп += o.ToString() + "\r\n";
             }
             оп += АтрибутДоступа + " " + АтрибутПереопредения + " " + ТипТипа + " " + Имя ;
             if (Тип.BaseType != null) оп  += " : "+ Тип.BaseType.Name;

             foreach (var type in Тип.GetInterfaces())
             {
                 оп += " , " +  type.ИмяТипа(); 
             }


             return оп;
         }}

    }

    
}
